collections 模块 -> Python 中扩展的数据类型
1. nametuple('元组名称', list) -> 命名元组 -> 生成可以使用名字访问的元组
我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
p = (1, 2)
但是,看到 (1, 2),很难看出这个tuple是用来表示一个坐标的。
这是,nametuple 就派上用场了:
from collections import namedtuple
Point = namedtuple('point', ['x', 'y']) # point是坐标的意思
p = Point(1, 2)
print(p) # point(x=1, y=2)
print(p.x) # 1
print(p.y) # 2
print(p[0]) # 1
print(p[1]) # 2
2. deque(list) -> 两端队列
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表:
from collections import deque
dq = deque([1, 2])
dq.append('a') # 从后面添加数据 [1, 2, 'a']
dq.appendleft('b') # 从左边添加数据 ['b', 1, 2, 'a']
dq.insert(2, '插入的数据') # 插入数据 ['b', 1, '插入的数据', 2, 'a']
print(dq.pop()) # a 从后面取数据(可以理解为删除数据)
print(dq.popleft()) # b 从左边取数据(可以理解为删除数据)
print(dq) # deque([1, '插入的数据', 2])
3. OrderedDict() -> 有序字典 -> 在 3.7 版本中字典默认有序
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od['a']) # 1
for k in od:
print(k) # a b c
4. defaultdict(调用的函数的函数名或匿名函数) -> 带有默认值的字典
有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66 , 'k2': 小于66}
values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
my_dict = {}
for value in values:
if value > 66:
if 'k1' in my_dict:
my_dict['k1'].append(value)
else:
my_dict['k1'] = [value]
else:
if 'k2' in my_dict:
my_dict['k2'].append(value)
else:
my_dict['k2'] = [value]
print(my_dict) # {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]}
使用dict时,如果引用的Key不存在,就要进行判断如果不判断就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict
my_dict = defaultdict(list)
values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
for value in values:
if value > 66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
print(my_dict) # defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})
defaultdict() 的参数一定要是可被调用的函数的函数名或匿名函数
d_list = defaultdict(list) # 字典默认值是列表
print(d_list['l']) # []
d_dict = defaultdict(dict) # 字典默认值是字典
print(d_dict['d']) # {}
d_set = defaultdict(set) # 字典默认值是字典
print(d_set['s']) # set()
d_other = defaultdict(lambda: 5) # 如果想字典默认值是数字,字符串的时候就是用匿名函数
5. Counter() -> 用来跟踪值出现的次数
from collections import Counter
c = Counter('abcdeabcdabcaba')
print(c) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
6. 其他的详细内容